//请编写一个函数，使其可以删除某个链表中给定的（非末尾）节点，你将只被给定要求被删除的节点。 
//
// 现有一个链表 -- head = [4,5,1,9]，它可以表示为: 
//
// 
//
// 
//
// 示例 1: 
//
// 输入: head = [4,5,1,9], node = 5
//输出: [4,1,9]
//解释: 给定你链表中值为 5 的第二个节点，那么在调用了你的函数之后，该链表应变为 4 -> 1 -> 9.
// 
//
// 示例 2: 
//
// 输入: head = [4,5,1,9], node = 1
//输出: [4,5,9]
//解释: 给定你链表中值为 1 的第三个节点，那么在调用了你的函数之后，该链表应变为 4 -> 5 -> 9.
// 
//
// 
//
// 说明: 
//
// 
// 链表至少包含两个节点。 
// 链表中所有节点的值都是唯一的。 
// 给定的节点为非末尾节点并且一定是链表中的一个有效节点。 
// 不要从你的函数中返回任何结果。 
// 
// Related Topics 链表

package leetcode.editor.cn;

public class DeleteNodeInALinkedList {
    public static void main(String[] args) {
        Solution solution = new DeleteNodeInALinkedList().new Solution();
        ListNode listNode = ListNodeUtil.constructList(new int[]{4, 5, 1, 9});
        solution.deleteNode(listNode.next);
        ListNodeUtil.printList(listNode);
    }

    //leetcode submit region begin(Prohibit modification and deletion)

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     * int val;
     * ListNode next;
     * ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        /**
         * [4,5,1,9], node = 5
         * 变成
         * 4,1,9
         * 此时只给了5这个节点，前面的4是我们拿不到的。
         * 只能把后面的1,9，挨着挨着复制到前面来
         *
         * @param node
         */
        public void deleteNode(ListNode node) {
            ListNode current = node;
            ListNode prev = null;
            while (current != null) {
                if (current.next != null) {
                    current.val = current.next.val;
                } else {
                    prev.next = null;
                }
                prev = current;
                current = current.next;
            }

        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}